package Array;

import org.junit.Test;

import java.util.Arrays;

/**
 * @BelongsProject: SeniorArchitect-LeetCode
 * @BelongsPackage: Array
 * @Author: zhuangxiaoyan
 * @CreateTime: 2023-10-19  21:39
 * @Description: TODO
 * @Version: 1.0
 */
public class 除自身以外数组的乘积238 {

    public int[] productExceptSelf(int[] nums) {
        if (nums.length <= 0) {
            return nums;
        }
        int[] array = new int[nums.length];
        Arrays.fill(array, 1);
        for (int i = 1; i < nums.length; i++) {
            array[i] = nums[i - 1] * array[i - 1];
        }
        int[] array2 = new int[nums.length];
        Arrays.fill(array2, 1);
        for (int i = nums.length - 2; i >= 0; i--) {
            array2[i] = array2[i + 1] * nums[i + 1];
        }
        for (int i = 0; i < nums.length; i++) {
            array[i] = array[i] * array2[i];
        }
        return array;
    }

    public int[] productExceptSelf2(int[] nums) {
        int length = nums.length;
        int[] answer = new int[length];

        // answer[i] 表示索引 i 左侧所有元素的乘积
        // 因为索引为 '0' 的元素左侧没有元素， 所以 answer[0] = 1
        answer[0] = 1;
        for (int i = 1; i < length; i++) {
            answer[i] = nums[i - 1] * answer[i - 1];
        }

        // R 为右侧所有元素的乘积
        // 刚开始右边没有元素，所以 R = 1
        int R = 1;
        for (int i = length - 1; i >= 0; i--) {
            // 对于索引 i，左边的乘积为 answer[i]，右边的乘积为 R
            answer[i] = answer[i] * R;
            // R 需要包含右边所有的乘积，所以计算下一个结果时需要将当前值乘到 R 上
            R *= nums[i];
        }
        return answer;
    }

    @Test
    public void test(){
        int[] ints = productExceptSelf(new int[]{1, 2, 3, 4});
        System.out.println(Arrays.toString(ints));
    }
}
